package Model.symtable;

import java.util.ArrayList;
import java.util.Collection;

// classe corresponde a uma declaração de classe na tab. de s�mbolos
public class EntryClass extends EntryTable {

    private EntryClass parent; // entrada correspondente à superclasse
    private Collection<EntryVar> variaveis;   //variaveis e constantes são a mesma coisa só muda um atributo;
    private Collection<EntryMethod> metodos;

    public EntryClass(String n) {
        name = n; // nome da classe declarada
        parent = null; // sua superclasse
        variaveis = new ArrayList<>();
        metodos = new ArrayList<>();
    }

    public EntryClass(String n, EntryClass p) {
        name = n; // nome da classe declarada
        parent = p; // sua superclasse
        variaveis = new ArrayList<>();
        metodos = new ArrayList<>();
    }
    
    public EntryClass getParent() {
        return parent;
    }

    public void setParent(EntryClass parent) {
        this.parent = parent;
    }

    public Collection<EntryVar> getVariaveis() {
        return variaveis;
    }

    public void setVariaveis(Collection<EntryVar> variaveis) {
        this.variaveis = variaveis;
    }

    public Collection<EntryMethod> getMetodos() {
        return metodos;
    }

    public void setMetodos(Collection<EntryMethod> metodos) {
        this.metodos = metodos;
    }

    public boolean hasSuperClass() {
        if (parent == null) {
            return false;
        } else {
            return true;
        }
    }

    public EntryVar getVariables(String nome) {
        for (EntryVar var : variaveis) {
            if (var.getName() != null) {
                if (var.getName().equals(nome)) {
                    return var;
                }
            }
        }
        return null;
    }
    public EntryMethod getMethod(String nome) {
        for (EntryMethod method : metodos) {
            if (method.getName() != null) {
                if (method.getName().equals(nome)) {
                    return method;
                }
            }
        }
        if (this.hasSuperClass()) {
                EntryClass classePai = this.getParent();
                for (EntryMethod met : classePai.getMetodos()) {
                    if (met.getName() != null) {
                        if (met.getName().equals(nome)) {
                            return met;
                        }
                    }
                }
            }
        return null;
    }
     public ArrayList<EntryMethod> getMethods(String nome) {
         ArrayList<EntryMethod> listMetodos = new ArrayList<>();
         for (EntryMethod method : metodos) {
            if (method.getName() != null) {
                if (method.getName().equals(nome)) {
                    listMetodos.add(method);
                }
            }
        }
         if (this.hasSuperClass()) {
                EntryClass classePai = this.getParent();
                for (EntryMethod method : classePai.getMetodos()) {
                    if (method.getName() != null) {
                        if (method.getName().equals(nome)) {
                            listMetodos.add(method);
                        }
                    }
                }
            }
        return listMetodos;
    }
     
}
